zabbix监控nginx

        要对nginx进行监控,都需要做什么。

  • 开启nginx监控
  • 编写脚本来进行数据采集
  • 设置用户自定义参数
  • 重启zabbix-agent
  • 添加item
  • 创建图形
  • 创建触发器
  • 创建模版

编写数据采集脚本

        nginx在10.8.8.22上启用的,因此脚本要上传到10.8.8.22上。

        修改 zabbix_agentd.conf,把 Include 修改为只引入后缀名为.conf 的文件,更严
谨,而且除了配置文件之外,脚本也能放到这里。不会影响受到影响

1
Include=/etc/zabbix/zabbix_agentd.d/*.conf

编写监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash
############################################################
# $Name: zabbix_nginx.sh
# $Version: v1.0
# $Function: zabbix plugins
# $Author: yanyi
# $organization: dcgamer.top
# $Description: Monitor Nginx Status
############################################################
NGINX_PORT=8080
NGINX_COMMAND=$1
nginx_active(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://10.8.8.22:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac

        给脚本添加执行权限

1
chmod +x zabbix_nginx.sh

        重要的是这个脚本有zabbix的执行权限,然后它会在运行的时候在tmp目录下生成tmp文件。

        测试一下这个文件

1
2
3
4
5
6
[root@zabbix-server zabbix_agentd.d]# ./zabbix_nginx.sh active
1
[root@zabbix-server zabbix_agentd.d]# ./zabbix_nginx.sh reading
0
[root@zabbix-server zabbix_agentd.d]# ./zabbix_nginx.sh writing
1

        接下来再查看一下nginx的配置文件关于状态显示的部分

1
2
3
4
5
6
7
location /nginx_status {
stub_status on;
access_log off;
allow 10.8.8.0/24;
allow 192.168.5.0/24;
deny all;
}

        注:添加权限的设置目的是更安全

        编写配置文件

1
2
[root@zabbix-server zabbix_agentd.d]# cat zabbix_nginx.conf
UserParameter=nginx_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_nginx.sh "$1"

        延伸:当我们要传递多个参数的时候可以使用“[*]”的写法,比如:

1
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/zabbix_nginx.sh "$1" "$2" "$3"

        这里的 linux.status[*]的写法其实意思就是我可以传递多个参数

        那么在使用 zabbix_get 的时候就可以通过这个来传递多个参数,比如:

1
[root@Zabbix-server ~]# zabbix_get -s x.x.x.x -k nginx_status[参数 1,参数 2,参数 3]

        配置完成以后,进行get测试

1
2
[root@zabbix-server zabbix_agentd.d]# zabbix_get -s 10.8.8.22 -k nginx_status[active]
1

        通过检测,证明没有问题,接下来就是要把这些监控的内容全部添加到一个模版中去。

添加一个模版

        操作步骤:configuration–>template–>create template

01

添加监控项

        操作步骤:configuration–>templates–>刚才加的模版–>item–>create item

02

        application就是item的组

        当然监控项不止这一个,可以使用简便的方法实现这个items的添加,就是对刚才已经添加好的进行克隆。

        单击刚才添加的监控项,拉到最下面,然后有一个clone。全部添加好以后如图所示

03

添加触发器

        触发器是当达成某一个条件以后会执行某一个动作,比如cpu使用率达到多少以后要进行报警,报警以后要执行发邮件 ,或者发微信、发短信的操作。

        首先看一下报警脚本的存放位置

1
2
3
4
[root@zabbix-server ~]# cat /etc/zabbix/zabbix_server.conf | grep "Alert*"
### Option: AlertScriptsPath
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts

        用shell实现一个简单报警的步骤

  1. 报警脚本存放的位置
  2. 要支持三个参数,收件人、主题、内容
  3. 执行权限
  4. web界面添加
  5. 修改action

        这里模拟一个发短信的报警脚本。将报警内容输出到/tmp/sms.log,也可以通过脚本实现发送邮件等。关于短信发送的相关信息可以参考阿里大于,在阿里大于的帮助平台提供有短信发送的API以及相关参数。

        编写报警脚本

1
2
3
4
5
6
7
8
9
10
11
[root@zabbix-server ~]# cd /usr/lib/zabbix/alertscripts/
[root@zabbix-server alertscripts]# cat sms.sh
#!/bin/bash
ALERT_TO=$1
ALERT_TITLE=$2
ALERT_BODY=$3
echo $ALERT_TO >> /tmp/sms.log
echo $ALERT_TITLE >> /tmp/sms.log
echo $ALERT_BODY >> /tmp/sms.log
当我们接收到报警脚本以后会把上面的内容追加到/tmp/sms.log 中。
[root@zabbix-server tmp]# chmod +x /usr/lib/zabbix/alertscripts/sms.sh

        添加告警类型:

        操作步骤:administrator–>media type–>add

04

        操作步骤:configuration–>actions–>operations

        修改用户的media为SMS

05

        添加触发器:这里添加一个触发器,当nginx的active nember大于3的时候就报警,之所有设置大于3是因为方便看到结果。

        操作步骤:选择configuration,然后选择host对应的主机,直接选择触发器,创建触发器,起名字

06

        expression表达式既可以自己写也可以通过add来进行添加自动生成

        观察右上角的报警,通过ab进行压力测试以后可以很快的达成我们想要的结果

07

        然后查看tmp下是否有sms.log文件并且文件中是否有内容

1
2
3
4
5
6
7
8
9
10
11
[root@zabbix-server tmp]# tail -f sms.log
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*ame): Linux mobanji 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64
xxxxx.@qq.com
PROBLEM: Nginx Active>3
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tatus[active]): 4
xxxxx.@qq.com
PROBLEM: Nginx Active>3
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tatus[active]): 4
xxxxx.@qq.com
PROBLEM: Nginx Active>3
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tatus[active]): 4

        可以发现,确实是执行报警脚本了,现在把压力测试关掉

1
2
3
4
5
6
xxxxx.@qq.com
PROBLEM: Nginx Active>3
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tatus[active]): 4
xxxxx.@qq.com
OK: Nginx Active>3
Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tatus[active]): 1

        发现故障恢复了也会发送相关的信息

        在实际运维的过程当中,应该对需要发送的信息进行相关的优化,因为国内一条短信的长度是有限制的,一个汉字和一个字母都算作一个字符。超过限制就会分为两条甚至多条进行发送,因此要把关键的信息挑出来

08

        查看日志信息

1
2
3
4
5
6
xxxxx.@qq.com
状态:PROBLEM
主机:(Zabbix server 监控项:nginx_status[active]): 5
xxxxx.@qq.com
状态:OK
主机:(Zabbix server 监控项:nginx_status[active]): 1

添加图形

        然后添加完图形以后就可以对模版进行应用了。

        点击到对应的主机–>template–>搜索创建的模版–>add–>update

        添加完成模版以后添加图形:模版–>创建的模版–>graphs–>create graphs

09

10

模版的导出

        configuration–>勾选模版–>选择最下面的export–>导出

        因为zabbix所有导出的模版都是一个名字,因此对于导出的模版要进行重命名

11

12

模版的导入

        在模版界面的右上角

13

        进行压力测试

1
[root@zabbix-server ~]# ab -c 10 -n 1000000 http://10.8.8.22:8080/

14